
/** 格式化数值相关 */
function formatByValues(values, fmt, prefix) {
    prefix = prefix || "0000";
    return fmt.replace(/(.)\1{0,}/g, function (matchString, index, self) {
        var key = matchString[0];
        if (key && values.hasOwnProperty(key)) {
            var value = values[key];
            var valueStr = value.toString();
            if (matchString.length == 1) {
                return valueStr;
            } else {
                return (prefix + valueStr).substr(valueStr.length + prefix.length - matchString.length);
            }
        } else {
            return matchString;
        }
    });
}
/**
 * 格式化日期
 * @param {Date} date 
 * @param {string} fmt 
 */
function formatDate(date, fmt) {
    if (fmt == null) {
        // fmt = 'YYYY-MM-DD hh:mm:ss SSS';
        fmt = 'YYYY-MM-DD hh:mm:ss';
    }

    var values = {
        "Y": date.getFullYear(),
        "M": date.getMonth() + 1,
        "D": date.getDate(),
        "h": date.getHours(),
        "m": date.getMinutes(),
        "s": date.getSeconds(),
        "S": date.getMilliseconds(),
    };
    return formatByValues(values, fmt);
}


function formatBytes(size) {
    if (size < 2 ** 10) {
        return `${size}B`;
    }
    if (size < 2 ** 20) {
        return `${+(size / 2 ** 10).toFixed(2)}KB`;
    }
    if (size < 2 ** 30) {
        return `${+(size / 2 ** 20).toFixed(2)}MB`;
    }
    if (size < 2 ** 40) {
        return `${+(size / 2 ** 30).toFixed(2)}GB`;
    }
    if (size < 2 ** 50) {
        return `${+(size / 2 ** 40).toFixed(2)}TB`;
    }
    if (size < 2 ** 60) {
        return `${+(size / 2 ** 50).toFixed(2)}PB`;
    }
    if (size < 2 ** 70) {
        return `${+(size / 2 ** 60).toFixed(2)}EB`;
    }
    if (size < 2 ** 80) {
        return `${+(size / 2 ** 70).toFixed(2)}ZB`;
    }
    return `${+(size / 2 ** 80).toFixed(2)}YB`;
}

module.exports = {
    formatByValues, 
    formatDate,
    formatBytes,
}

